package jp.co.dailyReport;

import org.apache.log4j.Logger;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.project.Project;
import jp.co.dailyReport.dailyReport.DailyReport;
import jp.co.dailyReport.dailyReport.DailyReportManager;
import jp.co.dailyReport.dailyReport.DailyReportWorkItem;
import jp.co.dailyReport.weeklyReport.WeeklyReport;
import jp.co.dailyReport.weeklyReport.WeeklyReportManager;
import jp.co.dailyReport.weeklyReport.WeeklyReportWorkItem;
import jp.co.dailyReport.staff.StaffManager;

/**
 * 権限情報管理クラス
 */
public class PermissionManager {

	private static Logger log = Logger.getLogger(PermissionManager.class);

	//社員情報登録
	public static final int STAFF_REGISTRATION = 0;
	//社員情報更新
	public static final int STAFF_UPDATE = 1;
	//社員情報削除
	public static final int STAFF_DELETE = 2;
	//取引先情報登録
	public static final int CUSTOMER_REGISTRATION = 3;
	//取引先情報更新
	public static final int CUSTOMER_UPDATE = 4;
	//取引先情報削除
	public static final int CUSTOMER_DELETE = 5;
	//ﾌﾟﾛｼﾞｪｸﾄ情報登録
	public static final int PROJECT_REGISTRATION = 6;
	//ﾌﾟﾛｼﾞｪｸﾄ情報更新
	public static final int PROJECT_UPDATE = 7;
	//ﾌﾟﾛｼﾞｪｸﾄ情報削除
	public static final int PROJECT_DELETE = 8;
	//日報登録
	public static final int DAILYREPORT_REGISTRATION = 9;
	//日報更新
	public static final int DAILYREPORT_UPDATE = 10;
	//日報削除
	public static final int DAILYREPORT_DELETE = 11;
	//週報登録
	public static final int WEEKLYREPORT_REGISTRATION = 12;
	//週報更新
	public static final int WEEKLYREPORT_UPDATE = 13;
	//週報削除
	public static final int WEEKLYREPORT_DELETE = 14;
	//日報検索
	public static final int DAILYREPORT_SEARCH = 15;
	//週報検索
	public static final int WEEKLYREPORT_SEARCH = 16;
	//稼働時間集計（社員毎）
	public static final int HOURS_WORKEDFOREVERYSTAFF = 17;
	//稼働時間集計（ﾌﾟﾛｼﾞｪｸﾄ毎）
	public static final int HOURS_WORKEDFOREVERYPROJECT = 18;
	//仕掛計上
	public static final int WORKINHAND_DECLARE = 19;
	//読み込み権限
	public static final int METHOD_READ = 0;
	//書込み権限
	public static final int METHOD_WRITE = 1;

	/**
	 * 社員に業務の権限があるか判断します。<BR><BR>
	 * 
	 * 雇用形態：ｱﾙﾊﾞｲﾄ、外注<BR>
	 * 権限：一般ﾕｰｻﾞ、管理職ﾕｰｻﾞ、ｼｽﾃﾑ管理ﾕｰｻﾞ<BR>
	 * 権限あり業務：日報登録、日報訂正、日報削除、日報検索<BR><BR>
	 * 
	 * 雇用形態：社員<BR>
	 * 権限：一般ﾕｰｻﾞ<BR>
	 * 権限あり業務：日報登録、日報訂正、日報削除、日報検索、週報検索<BR><BR>
	 * 
	 * 雇用形態：社員<BR>
	 * 権限：管理職ﾕｰｻﾞ<BR>
	 * 権限あり業務：日報登録、日報訂正、日報削除、週報登録、週報訂正、<BR>
	 * 　　　　　　　週報削除、日報検索、週報検索、社員毎稼働時間の集計<BR>
	 * 　　　　　　　ﾌﾟﾛｼﾞｪｸﾄ毎稼働時間の集計、仕掛計上<BR><BR>
	 * 
	 * 雇用形態：社員<BR>
	 * 権限：ｼｽﾃﾑ管理ﾕｰｻﾞ<BR>
	 * 権限あり業務：日報登録、日報訂正、日報削除、週報登録、週報訂正、<BR>
	 * 　　　　　　　週報削除、日報検索、週報検索、社員毎稼働時間の集計<BR>
	 * 　　　　　　　ﾌﾟﾛｼﾞｪｸﾄ毎稼働時間の集計、仕掛計上、社員情報登録<BR>
	 * 　　　　　　　社員情報編集、社員情報削除、取引先情報登録、<BR>
	 * 　　　　　　　取引先情報編集、取引先情報削除、ﾌﾟﾛｼﾞｪｸﾄ情報登録、<BR>
	 * 　　　　　　　ﾌﾟﾛｼﾞｪｸﾄ情報編集、ﾌﾟﾛｼﾞｪｸﾄ情報削除<BR><BR>
	 * 
	 * @param staff 社員オブジェクト<BR>
	 * @param operationId 業務ID<BR>
	 * @param methodId 操作方法ID（読み込み:0、書き込み:1）<BR>
	 * @return flg true→権限あり、false→権限なし<BR>
	 * @throws DataUnavailableException
	 */
	public static boolean hasPermission(Staff staff,int operationId,int methodId) 
		throws DataUnavailableException {

		boolean flg = false;
		try {
			int[] operationIds = getOperationIds(staff);
			for(int i=0;i<operationIds.length;i++){
				if(operationId==operationIds[i]){
					flg = true;
				}
			}
		} catch(DataUnavailableException due) {
			log.error(due.toString(), due);
        }
		return flg;
	}

	/**
	 * 社員にﾌﾟﾛｼﾞｪｸﾄ情報のアクセス権限があるか判断します。<BR><BR>
	 * 
	 * アクセス権限あり社員条件：一般ﾕｰｻﾞ(ﾌﾟﾛｼﾞｪｸﾄﾘｰﾀﾞｰ)、管理職ﾕｰｻﾞ(ﾌﾟﾛｼﾞｪｸﾄﾘｰﾀﾞｰ)、ｼｽﾃﾑ管理ﾕｰｻﾞ<BR><BR>
	 * 
	 * @param staff 社員オブジェクト<BR>
	 * @param project プロジェクトオブジェクト<BR>
	 * @param methodId 操作方法ID（読み込み:0、書き込み:1）<BR>
	 * @return flg true→アクセス権限あり、false→アクセス権限なし<BR>
	 * @throws DataUnavailableException
	 */
	public static boolean hasPermission(Staff staff,Project project,int methodId) 
		throws DataUnavailableException {

		boolean flg = false;
		int position = staff.getPosition();
		//一般ﾕｰｻﾞ、管理職ﾕｰｻﾞ
		if(position != Integer.parseInt(Staff.STAFF_POSITION_ID[2])){
			if(StaffManager.isProjectLeader(staff)){
				if(staff.getStaffId()==project.getPLStaffId()){
					flg = true;
				}
			}
		//ｼｽﾃﾑ管理ﾕｰｻﾞ
		} else {
			flg = true;
		}
		return flg;
	}

	/**
	 * 社員に日報情報のアクセス権限があるか判断します。<BR><BR>
	 * 
	 * 自分が登録した日報情報のみアクセス権限あり社員条件：ｱﾙﾊﾞｲﾄ、外注<BR>
	 * 全ての日報情報アクセス権限あり社員条件：社員<BR><BR>
	 * 
	 * @param staff 社員オブジェクト<BR>
	 * @param dailyReport 日報オブジェクト<BR>
	 * @param methodId 操作方法ID（読み込み:0、書き込み:1）<BR>
	 * @return flg true→アクセス権限あり、false→アクセス権限なし<BR>
	 * @throws DataUnavailableException<BR>
	 */
	public static boolean hasPermission(Staff staff,DailyReport dailyReport,int methodId) 
		throws DataUnavailableException {

		boolean flg = false;
		int position = staff.getPosition();
		int employmentSystem = staff.getEmploymentSystem();

		//ｱﾙﾊﾞｲﾄ、外注
		if(employmentSystem != Integer.parseInt(Staff.STAFF_EMPLOYMENTSYSTEM_ID[2])){
			if(staff.getStaffId()==dailyReport.getStaffId()){
				flg = true;
			}
		}else{
			flg = true;
		}
		return flg;
	}

	/**
	 * 社員に週報情報のアクセス権限があるか判断します。<BR><BR>
	 * 
	 * アクセス権限あり社員条件：ｱﾙﾊﾞｲﾄ(ﾌﾟﾛｼﾞｪｸﾄﾘｰﾀﾞｰで自分が登録した週報情報)、外注(ﾌﾟﾛｼﾞｪｸﾄﾘｰﾀﾞｰで自分が登録した週報情報)、社員<BR><BR>
	 * 
	 * @param staff 社員オブジェクト<BR>
	 * @param weeklyReport 週報オブジェクト<BR>
	 * @param methodId 操作方法ID（読み込み:0、書き込み:1）<BR>
	 * @return flg true→アクセス権限あり、false→アクセス権限なし<BR>
	 * @throws DataUnavailableException
	 */
	public static boolean hasPermission(Staff staff,WeeklyReport weeklyReport,int methodId) 
		throws DataUnavailableException {

		boolean flg = false;
		int position = staff.getPosition();
		int employmentSystem = staff.getEmploymentSystem();

		//ｱﾙﾊﾞｲﾄ、外注
		if(employmentSystem != Integer.parseInt(Staff.STAFF_EMPLOYMENTSYSTEM_ID[2])){
			if(StaffManager.isProjectLeader(staff)){
				if(staff.getStaffId()==weeklyReport.getStaffId()){
					flg = true;
				}
			}
		//社員
		}else{
			flg = true;
		}
		return flg;
	}

	/**
	 * 社員に日報作業項目情報のアクセス権限があるか判断します。<BR><BR>
	 * 
	 * 自分が登録した日報作業項目情報のみアクセス権限あり社員条件：ｱﾙﾊﾞｲﾄ、外注<BR>
	 * 全ての日報作業項目情報アクセス権限あり社員条件：社員<BR><BR>
	 * 
	 * @param staff 社員オブジェクト<BR>
	 * @param dailyReportWorkItem 日報作業項目オブジェクト<BR>
	 * @param methodId 操作方法ID（読み込み:0、書き込み:1）<BR>
	 * @return flg true→アクセス権限あり、false→アクセス権限なし<BR>
	 * @throws DataUnavailableException
	 */
	public static boolean hasPermission(Staff staff,DailyReportWorkItem dailyReportWorkItem,int methodId) 
		throws DataUnavailableException {

		boolean flg = false;
		int position = staff.getPosition();
		int employmentSystem = staff.getEmploymentSystem();
		DailyReport dailyReport = DailyReportManager.load(dailyReportWorkItem.getDailyReportId());
		//ｱﾙﾊﾞｲﾄ、外注
		if(employmentSystem != Integer.parseInt(Staff.STAFF_EMPLOYMENTSYSTEM_ID[2])){
			if(staff.getStaffId()==dailyReport.getStaffId()){
				flg = true;
			}
		}else{
			flg = true;
		}
		return flg;
	}

	/**
	 * 社員に週報作業項目情報のアクセス権限があるか判断します。<BR><BR>
	 * 
	 * アクセス権限あり社員条件：ｱﾙﾊﾞｲﾄ(ﾌﾟﾛｼﾞｪｸﾄﾘｰﾀﾞｰで自分が登録した週報作業項目情報)、外注(ﾌﾟﾛｼﾞｪｸﾄﾘｰﾀﾞｰで自分が登録した週報作業項目情報)、社員<BR><BR>
	 * 
	 * @param staff 社員オブジェクト<BR>
	 * @param weeklyReportWorkItem 週報作業項目オブジェクト<BR>
	 * @param methodId 操作方法ID（読み込み:0、書き込み:1）<BR>
	 * @return flg true→アクセス権限あり、false→アクセス権限なし<BR>
	 * @throws DataUnavailableException
	 */
	public static boolean hasPermission(Staff staff,WeeklyReportWorkItem weeklyReportWorkItem,int methodId) 
		throws DataUnavailableException {

		boolean flg = false;
		int position = staff.getPosition();
		int employmentSystem = staff.getEmploymentSystem();
		WeeklyReport weeklyReport = WeeklyReportManager.load(weeklyReportWorkItem.getWeeklyReportId());

		//ｱﾙﾊﾞｲﾄ、外注
		if(employmentSystem != Integer.parseInt(Staff.STAFF_EMPLOYMENTSYSTEM_ID[2])){
			if(StaffManager.isProjectLeader(staff)){
				if(staff.getStaffId()==weeklyReport.getStaffId()){
					flg = true;
				}
			}
		//社員
		}else{
				flg = true;
		}
		return flg;
	}

	/**
	 * 社員の権限、雇用形態で業務IDを取得します。<BR><BR>
	 * 
	 * 雇用形態：ｱﾙﾊﾞｲﾄ、外注<BR>
	 * 権限：一般ﾕｰｻﾞ、管理職ﾕｰｻﾞ、ｼｽﾃﾑ管理ﾕｰｻﾞ<BR>
	 * 業務ID：日報登録、日報訂正、日報削除、日報検索<BR><BR>
	 * 
	 * 雇用形態：社員<BR>
	 * 権限：一般ﾕｰｻﾞ<BR>
	 * 業務ID：日報登録、日報訂正、日報削除、日報検索、週報検索<BR><BR>
	 * 
	 * 雇用形態：社員<BR>
	 * 権限：管理職ﾕｰｻﾞ<BR>
	 * 業務ID：日報登録、日報訂正、日報削除、週報登録、週報訂正、<BR>
	 * 　　　　週報削除、日報検索、週報検索、社員毎稼働時間の集計<BR>
	 * 　　　　ﾌﾟﾛｼﾞｪｸﾄ毎稼働時間の集計、仕掛計上<BR><BR>
	 * 
	 * 雇用形態：社員<BR>
	 * 権限：ｼｽﾃﾑ管理ﾕｰｻﾞ<BR>
	 * 業務ID：日報登録、日報訂正、日報削除、週報登録、週報訂正、<BR>
	 * 　　　　週報削除、日報検索、週報検索、社員毎稼働時間の集計<BR>
	 * 　　　　ﾌﾟﾛｼﾞｪｸﾄ毎稼働時間の集計、仕掛計上、社員情報登録<BR>
	 * 　　　　社員情報編集、社員情報削除、取引先情報登録、<BR>
	 * 　　　　取引先情報編集、取引先情報削除、ﾌﾟﾛｼﾞｪｸﾄ情報登録、<BR>
	 * 　　　　ﾌﾟﾛｼﾞｪｸﾄ情報編集、ﾌﾟﾛｼﾞｪｸﾄ情報削除<BR><BR>
	 * 
	 * @param staff 社員オブジェクト<BR>
	 * @return 業務IDの配列<BR>
	 * @throws DataUnavailableException
	 */
	private static int[] getOperationIds(Staff staff) throws DataUnavailableException {

		int position = staff.getPosition();
		int employmentSystem = staff.getEmploymentSystem();
		int[] operationIds = {DAILYREPORT_REGISTRATION,DAILYREPORT_UPDATE,DAILYREPORT_DELETE};

		//ｱﾙﾊﾞｲﾄ,外注
		if(employmentSystem != Integer.parseInt(Staff.STAFF_EMPLOYMENTSYSTEM_ID[2])){
			operationIds = new int[4];
			operationIds[0] = DAILYREPORT_REGISTRATION;
			operationIds[1] = DAILYREPORT_UPDATE;
			operationIds[2] = DAILYREPORT_DELETE;
			operationIds[3] = DAILYREPORT_SEARCH;
		//社員
		}else{
			//一般ﾕｰｻﾞ
			if(position == Integer.parseInt(Staff.STAFF_POSITION_ID[0])){
				operationIds = new int[5];
				operationIds[0] = DAILYREPORT_REGISTRATION;
				operationIds[1] = DAILYREPORT_UPDATE;
				operationIds[2] = DAILYREPORT_DELETE;
				operationIds[3] = DAILYREPORT_SEARCH;
				operationIds[4] = WEEKLYREPORT_SEARCH;
			//管理職ﾕｰｻﾞ
			} else if(position == Integer.parseInt(Staff.STAFF_POSITION_ID[1])) {
				operationIds = new int[11];
				operationIds[0] = DAILYREPORT_REGISTRATION;
				operationIds[1] = DAILYREPORT_UPDATE;
				operationIds[2] = DAILYREPORT_DELETE;
				operationIds[3] = WEEKLYREPORT_REGISTRATION;
				operationIds[4] = WEEKLYREPORT_UPDATE;
				operationIds[5] = WEEKLYREPORT_DELETE;
				operationIds[6] = DAILYREPORT_SEARCH;
				operationIds[7] = WEEKLYREPORT_SEARCH;
				operationIds[8] = HOURS_WORKEDFOREVERYSTAFF;
				operationIds[9] = HOURS_WORKEDFOREVERYPROJECT;
				operationIds[10] = WORKINHAND_DECLARE;
			//ｼｽﾃﾑ管理ﾕｰｻﾞ
			} else if(position == Integer.parseInt(Staff.STAFF_POSITION_ID[2])) {
				operationIds = new int[20];
				operationIds[0] = STAFF_REGISTRATION;
				operationIds[1] = STAFF_UPDATE;
				operationIds[2] = STAFF_DELETE;
				operationIds[3] = CUSTOMER_REGISTRATION;
				operationIds[4] = CUSTOMER_UPDATE;
				operationIds[5] = CUSTOMER_DELETE;
				operationIds[6] = PROJECT_REGISTRATION;
				operationIds[7] = PROJECT_UPDATE;
				operationIds[8] = PROJECT_DELETE;
				operationIds[9] = DAILYREPORT_REGISTRATION;
				operationIds[10] = DAILYREPORT_UPDATE;
				operationIds[11] = DAILYREPORT_DELETE;
				operationIds[12] = WEEKLYREPORT_REGISTRATION;
				operationIds[13] = WEEKLYREPORT_UPDATE;
				operationIds[14] = WEEKLYREPORT_DELETE;
				operationIds[15] = DAILYREPORT_SEARCH;
				operationIds[16] = WEEKLYREPORT_SEARCH;
				operationIds[17] = HOURS_WORKEDFOREVERYSTAFF;
				operationIds[18] = HOURS_WORKEDFOREVERYPROJECT;
				operationIds[19] = WORKINHAND_DECLARE;
			}
		}
		return operationIds;
	}
}
